// ps:代码参考官解
package main

func main() {
	length := lengthOfLongestSubstring("helloabc")
	println(length)
}

func lengthOfLongestSubstring(s string) int {
	// "a"[0]=97是uint8类型的
	// map[uint8]bool{}等价于hashSet
	// mp[x]=true等价于hashSet.add(x)
	// mp[x]=false等价于hashSet.remove(x)
	mp := map[uint8]bool{}
	res := 0
	// 构造滑动窗口(双指针实现)
	for l, r := 0, 0; r < len(s); r++ {
		// 维护滑动窗口(窗口中无重复字符)
		for mp[s[r]] {
			// 窗口中有重复值，但我不知道是哪个，所以得依次遍历窗口把该值找出来踢出窗口（缩小窗口左边界）
			mp[s[l]] = false
			// 移动窗口
			l++
		}
		// 添加值到滑动窗口
		mp[s[r]] = true
		res = max(res, r-l+1)
	}
	return res
}
